package com.liu.fiter;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import javax.swing.plaf.PanelUI;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.Filter;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author hgvgh
 * TP指标: TP50：
 * 指在一个时间段内（如5分钟），统计该方法每次调用所消耗的时间，并将这些时间按从小到大的顺序进行排序，取第50%的那个值作为TP50 值；
 * 配置此监控指标对应的报警阀值后，需要保证在这个时间段内该方法所有调用的消耗时间至少有50%的值要小于此阀值，否则系统将会报警。
 * 參考資料： * 參考資料：https://www.cnblogs.com/robinunix/p/7827423.html
 * @version 1.0
 * @description
 * @date 2021/1/9
 */
@Activate(group = {CommonConstants.CONSUMER})
public class TPMonitorFilter implements Filter {

    private final TPMonitor tpMonitor = new TPMonitor();

    public TPMonitorFilter(){
        new Thread(tpMonitor).start();
    }

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        long now = System.currentTimeMillis();
        Result result = invoker.invoke(invocation);
        long useTime = System.currentTimeMillis() - now;
        tpMonitor.request(System.currentTimeMillis(),useTime);
        return result;
    }
}
